import { inject, injectable } from "inversify";
import { IEnvironmentActivationService } from "../../interpreter/activation/types";
import { IInterpreterAutoSelectionService } from "../../interpreter/autoSelection/types";
import { IComponentAdapter } from "../../interpreter/contracts";
import { IServiceContainer } from "../../ioc/types";
import { IFileSystem } from "../platform/types";
import { IConfigurationService, IDisposableRegistry, IInterpreterPathService } from "../types";
import { ExecutionFactoryCreateWithEnvironmentOptions, ExecutionFactoryCreationOptions, IBufferDecoder, IEQExecutionFactory, IEQExecutionService, IProcessLogger, IProcessService, IProcessServiceFactory } from "./types";

@injectable()
export class EQExecutionFactory implements IEQExecutionFactory {
  private readonly disposables: IDisposableRegistry;

  private readonly logger: IProcessLogger;

  private readonly fileSystem: IFileSystem;
  constructor(
    @inject(IServiceContainer) private serviceContainer: IServiceContainer,
    @inject(IEnvironmentActivationService) private readonly activationHelper: IEnvironmentActivationService,
    @inject(IProcessServiceFactory) private readonly processServiceFactory: IProcessServiceFactory,
    @inject(IConfigurationService) private readonly configService: IConfigurationService,
    @inject(IBufferDecoder) private readonly decoder: IBufferDecoder,
    @inject(IComponentAdapter) private readonly pyenvs: IComponentAdapter,
    @inject(IInterpreterAutoSelectionService) private readonly autoSelection: IInterpreterAutoSelectionService,
    @inject(IInterpreterPathService) private readonly interpreterPathExpHelper: IInterpreterPathService,
  ) {
    // Acquire other objects here so that if we are called during dispose they are available.
    this.disposables = this.serviceContainer.get<IDisposableRegistry>(IDisposableRegistry);
    this.logger = this.serviceContainer.get<IProcessLogger>(IProcessLogger);
    this.fileSystem = this.serviceContainer.get<IFileSystem>(IFileSystem);
  }
  create(options: ExecutionFactoryCreationOptions): Promise<IEQExecutionService> {
    throw new Error("1114Method not implemented.");
  }
  createActivatedEnvironment(options: ExecutionFactoryCreateWithEnvironmentOptions): Promise<IEQExecutionService> {
    throw new Error("1115Method not implemented.");
  }
  createCondaExecutionService(eqPath: string, processService: IProcessService): Promise<IEQExecutionService | undefined> {
    throw new Error("1116Method not implemented.");
  }
}